#!/bin/bash
# Project: bash_pro
# Filename: pathmgr
# Autor: Wojciech Ornowski
# Date: 2012-04-18
# Version: 1.0
# Licence: 
#
# Describe: Narzędzie do wpisywania do zmiennej systemowej PATH rekursywnie drzewa katalogów oraz do weryfikacji i usuwania nie istniejących ściezek.
#
# Usage: pathmgr [-l] wyświetla zmienną PATH
#	 pathmgr <ścieżka> dodaje pojedyńczą ścieżkę do PATH
#	 pathmgr -r <ścieżka> dodaje ścieżkę i wszystkie jej podkatalogi do PATH
#	 pathgmr -v weryfikuje i wyświetla nieistniejące ścieżki w PATH
#	 pathmgr -d | -vd weryfikuje i usuwa nieistniejące ścieżki z PATH
#	
# Exitcodes: 0-OK 1-Error


# VARIABLES
retval=1
scriptname=$0
oldIFS=$IFS
scriptpath=$(pwd) #present working directory
#oldOFS=$OFS
#IFS=":"
#OFS=":"


# FUNCTION 
# Name: 
# Describe: 
# Usage: [-a Argument1 | -b Argument2] Argument3
# Exitcodes: 0-OK 1-Error 2-Warning

# FUNCTION
# Name: printHelp()
# Describe: Funkcja drukująca Help
# Usage: printHelp bez argumentów
# Exitcodes: 0
printHelp()
{
  echo "Usage: 	$scriptname [-l] wyświetla zmienną PATH"
  echo "	$scriptname <ścieżka> dodaje pojedyńczą ścieżkę do PATH"
  echo "	$scriptname -r <ścieżka> dodaje ścieżkę i wszystkie jej podkatalogi do PATH"
  echo "	$scriptname -v weryfikuje i wyświetla nieistniejące ścieżki w PATH"
  echo "	$scriptname -d | -vd weryfikuje i usuwa nieistniejące ścieżki w PATH"
  echo "	$scriptname -h | --help wyświtla tą pomoc"
  return 0
}

# FUNCTION
# Name: destructor()
# Describe: Funkcja sprzątająca po skrypcie. Likwiduje pliki tymczasowe. Ustawia własciwy exitcode, przywraca zmiene systemowe itp
# Usage: destructor() kończy skrypt domyślnym exitcodem=1
#	 destructor() 0 kończy skrypt exitcodem 0
# Exitcodes: 0
destructor()
{

  if ! [ $# == 0 ] && [ $1 == 0 ]; then
    retval=0
  fi

  IFS=$oldIFS
#  OFS=$oldOFS
  exit $retval
}

# FUNCTION
# Name: ifDirectoryExist()
# Describe: 
# Usage: 
# Exitcodes: 
ifDirectoryExist()
{
  if ! [ -e $1 ]; then
    echo "Podana ścieżka nie istnieje: $1"
    destructor 1
  fi
}

# FUNCTION
# Name: ifExistInPATH()
# Describe: 
# Usage: 
# Exitcodes: 0 - nie ma w PATH 1 - już jest w PATH
ifExistInPATH()
{
  IFS=":"
  for directory2 in $PATH;
  do
    if [ $directory2 == $1 ]; then
    echo "Podana ścieżka już istnieje w PATH: $1"
    IFS=$oldIFS
    return 1
    fi
  done
  IFS=$oldIFS
  return 0
}

# FUNCTION
# Name: trimPath()
# Describe: Usówa znak / z końca ścieżki jeśli występuje. Wynik działania zwraca przez echo.
# Usage: 
# Exitcodes: 
trimPath()
{
var=$1
  if [ ${var:${#var}-1:${#var}} == / ]; then
    echo ${var:0:${#var}-1}
    return 0
  fi
  echo $1
}

# FUNCTION
# Name: listPath()
# Describe: 
# Usage: 
# Exitcodes: 
listPath()
{
  for directory in $@;
  do
    echo $directory
  done
}

# FUNCTION
# Name: addPath()
# Describe: 
# Usage: 
# Exitcodes: 
addPath()
{
  ifDirectoryExist $1
  #ifExistInPATH $1
  if [ $# == 1 ] && ifExistInPATH $1; then # dorobić anty-dublowanie ścieżek w Path.
    if [ ${#PATH} == 0 ]; then
     export PATH="`echo $PATH``trimPath $1`"
    else
     export PATH="`echo $PATH`:`trimPath $1`"
    fi
  elif [ $# == 2 ] && [ $2 == "-r" ]; then
    tree=`du $1 | cut -f2`
    for directory in $tree;
    do
      addPath $directory #rekursja
    done
  fi
}

# FUNCTION
# Name: verification()
# Describe: 
# Usage: 
# Exitcodes: 
verification()
{
  for directory in $@;
  do
    if ! [ -e $directory ]; then
  echo $directory
    fi
  done
}

# FUNCTION
# Name: delete()
# Describe: 
# Usage: 
# Exitcodes: 
delete()
{
  for directory in $@;
  do
  if ! [ -e $directory ]; then
    echo $directory
    echo usuwanie TODO
  fi
  done
}

# FUNCTION
# Name: switch()
# Describe: Funkcja interpretująca flagi.
# Usage: switch $@
# Exitcodes: 0 - flagi i argumenty prawidłowe 1 - błąd użycia skryptu
switch()
{
  if [ $# == 0 ] || `[ $1 == "-l" ] && [ $# == 1 ]`; then
    IFS=":"
    listPath $PATH
    IFS=$oldIFS
    return 0
  else
    if [ `echo $1 | cut -c1` == "/" ]; then
      addPath $1
      return 0
    elif [ $1 == "-r" ] && [ $# == 2 ]; then
      addPath $2 -r
      return 0
    elif [ $1 == "-v" ] && [ $# == 1 ]; then
      IFS=":"
      verification $PATH
      IFS=$oldIFS
      return 0
    elif [ $1 == "-d" ] || [ $1 == "-vd" ] && [ $# == 1 ]; then
      delete
      return 0
    elif [ $1 == "-h" ] || [ $1 == "--help" ] && [ $# == 1 ]; then
      printHelp
      return 0
    fi
  fi
  
  return 1
}

# MAIN
# Describe: 

switch $@
export PATH=$PATH:/root
destructor $?
echo "dupa"

exit $retval
